#include "bubblesortwindow.h"
#include <QApplication>
#include <QGraphicsRectItem>
#include <QGraphicsTextItem>
#include <QFont>
#include <QColor>
#include <QTime>
#include <QDebug>

BubbleSortWindow::BubbleSortWindow(QWidget *parent)
    : QMainWindow(parent), currentI(0), currentJ(0), isSorting(false), isComplete(false)
{
    setWindowTitle("冒泡排序可视化");
    setMinimumSize(800, 600);
    
    // 初始化随机数种子
    qsrand(QTime::currentTime().msec());
    
    // 创建中央部件
    centralWidget = new QWidget(this);
    setCentralWidget(centralWidget);
    
    // 创建主布局
    mainLayout = new QVBoxLayout(centralWidget);
    
    // 创建控制面板
    controlLayout = new QHBoxLayout();
    
    // 创建控件
    generateBtn = new QPushButton("生成随机数组", this);
    sortBtn = new QPushButton("开始排序", this);
    stepBtn = new QPushButton("单步执行", this);
    resetBtn = new QPushButton("重置", this);
    arraySizeSpinBox = new QSpinBox(this);
    statusLabel = new QLabel("就绪", this);
    
    // 设置数组大小范围
    arraySizeSpinBox->setRange(5, 50);
    arraySizeSpinBox->setValue(15);
    
    // 添加控件到控制布局
    controlLayout->addWidget(new QLabel("数组大小:", this));
    controlLayout->addWidget(arraySizeSpinBox);
    controlLayout->addWidget(generateBtn);
    controlLayout->addWidget(sortBtn);
    controlLayout->addWidget(stepBtn);
    controlLayout->addWidget(resetBtn);
    controlLayout->addWidget(statusLabel);
    controlLayout->addStretch();
    
    // 创建图形场景和视图
    scene = new QGraphicsScene(this);
    view = new QGraphicsView(scene);
    view->setRenderHint(QPainter::Antialiasing);
    view->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
    
    // 添加到主布局
    mainLayout->addLayout(controlLayout);
    mainLayout->addWidget(view);
    
    // 连接信号和槽
    connect(generateBtn, &QPushButton::clicked, this, &BubbleSortWindow::generateRandomArray);
    connect(sortBtn, &QPushButton::clicked, this, &BubbleSortWindow::startSorting);
    connect(stepBtn, &QPushButton::clicked, this, &BubbleSortWindow::stepSort);
    connect(resetBtn, &QPushButton::clicked, this, &BubbleSortWindow::resetArray);
    
    // 创建定时器
    sortTimer = new QTimer(this);
    connect(sortTimer, &QTimer::timeout, this, &BubbleSortWindow::stepSort);
    
    // 生成初始数组
    generateRandomArray();
}

BubbleSortWindow::~BubbleSortWindow()
{
}

void BubbleSortWindow::generateRandomArray()
{
    array.clear();
    int size = arraySizeSpinBox->value();
    
    for (int i = 0; i < size; ++i) {
        array.append(qrand() % 100 + 1); // 生成1-100的随机数
    }
    
    currentI = 0;
    currentJ = 0;
    isSorting = false;
    isComplete = false;
    
    sortTimer->stop();
    sortBtn->setText("开始排序");
    stepBtn->setEnabled(true);
    statusLabel->setText("已生成随机数组");
    
    drawArray();
}

void BubbleSortWindow::startSorting()
{
    if (!isSorting && !isComplete) {
        isSorting = true;
        sortBtn->setText("暂停排序");
        stepBtn->setEnabled(false);
        sortTimer->start(500); // 每500毫秒执行一步
    } else if (isSorting) {
        isSorting = false;
        sortBtn->setText("继续排序");
        stepBtn->setEnabled(true);
        sortTimer->stop();
    }
}

void BubbleSortWindow::stepSort()
{
    if (isComplete) {
        sortTimer->stop();
        return;
    }
    
    int n = array.size();
    
    // 执行冒泡排序的一步
    if (currentI < n - 1) {
        if (currentJ < n - 1 - currentI) {
            // 比较和交换
            if (array[currentJ] > array[currentJ + 1]) {
                swapElements(currentJ, currentJ + 1);
                statusLabel->setText(QString("交换元素 %1 和 %2").arg(currentJ).arg(currentJ + 1));
            } else {
                statusLabel->setText(QString("比较元素 %1 和 %2，无需交换").arg(currentJ).arg(currentJ + 1));
            }
            currentJ++;
        } else {
            // 完成一轮
            currentI++;
            currentJ = 0;
            statusLabel->setText(QString("完成第 %1 轮排序").arg(currentI));
        }
    } else {
        // 排序完成
        isComplete = true;
        isSorting = false;
        sortBtn->setText("排序完成");
        stepBtn->setEnabled(false);
        sortTimer->stop();
        statusLabel->setText("排序完成！");
    }
    
    drawArray();
}

void BubbleSortWindow::resetArray()
{
    generateRandomArray();
}

void BubbleSortWindow::swapElements(int i, int j)
{
    int temp = array[i];
    array[i] = array[j];
    array[j] = temp;
}

void BubbleSortWindow::drawArray()
{
    scene->clear();
    
    if (array.isEmpty()) return;
    
    int n = array.size();
    int maxValue = 100; // 固定最大值为100，因为我们生成1-100的随机数
    int barWidth = 800 / n - 2;
    int maxHeight = 400;
    
    for (int i = 0; i < n; ++i) {
        int height = (array[i] * maxHeight) / maxValue;
        int x = i * (barWidth + 2);
        int y = maxHeight - height;
        
        // 创建矩形
        QGraphicsRectItem *rect = scene->addRect(x, y, barWidth, height);
        
        // 设置颜色
        QColor color;
        if (isComplete) {
            color = QColor(76, 175, 80); // 绿色 - 排序完成
        } else if (i == currentJ && isSorting) {
            color = QColor(255, 193, 7); // 黄色 - 当前比较的元素
        } else if (i == currentJ + 1 && isSorting) {
            color = QColor(255, 193, 7); // 黄色 - 当前比较的元素
        } else if (i >= n - currentI) {
            color = QColor(156, 39, 176); // 紫色 - 已排序的部分
        } else {
            color = QColor(33, 150, 243); // 蓝色 - 未排序的部分
        }
        
        rect->setBrush(color);
        rect->setPen(QPen(Qt::black, 1));
        
        // 添加数值标签
        QGraphicsTextItem *text = scene->addText(QString::number(array[i]));
        text->setDefaultTextColor(Qt::white);
        text->setFont(QFont("Arial", 8));
        text->setPos(x + barWidth/2 - text->boundingRect().width()/2, 
                     y + height/2 - text->boundingRect().height()/2);
    }
    
    // 设置场景大小
    scene->setSceneRect(0, 0, n * (barWidth + 2), maxHeight + 50);
    view->fitInView(scene->sceneRect(), Qt::KeepAspectRatio);
} 